---
title: (Async)NotifierProvider
---

import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
import CodeBlock from "@theme/CodeBlock";
import todos from "./notifier_provider/todos";
import todosConsumer from "!!raw-loader!/docs/providers/notifier_provider/todos/todos_consumer.dart";
import remoteTodos from "./notifier_provider/remote_todos";
import remoteTodosConsumer from "!!raw-loader!/docs/providers/notifier_provider/remote_todos/todos_consumer.dart";
import { trimSnippet, AutoSnippet } from "../../../../../src/components/CodeSnippet";

[NotifierProvider] 是一个监听和暴露 [Notifier] 的provider。
[AsyncNotifier] 是一个可以异步初始化的 [Notifier]。
[AsyncNotifierProvider] 是一个用于监听和公开 [AsyncNotifier] 的provider。
`(Async)NotifierProvider` 和 `(Async)Notifier` 是Riverpod推荐的管理状态的方案，
这些状态可能会因用户交互而发生变化。

它一般用于：

- 暴露在对自定义事件做出反应后可以随时间推移变化的状态。
- 修改某些状态的逻辑(又名“业务逻辑”)集中在一个地方，随着时间的推移也能提高可维护性。

作为使用示例，我们使用 [NotifierProvider] 来实现一个待办清单。
这样做将允许我们公开 `addTodo` 等方法，让UI在用户交互时修改待办清单的列表：

<AutoSnippet language="dart" {...todos}></AutoSnippet>

现在我们定义了一个 [NotifierProvider] ，我们可以使用它来与UI中的待办清单列表交互：

<CodeBlock>{trimSnippet(todosConsumer)}</CodeBlock>

下面的使用示例，我们可以使用 [AsyncNotifierProvider] 来实现一个远程待办清单列表。
这样做将允许我们暴露 `addTodo` 等方法，让UI在用户交互时修改待办清单列表：

<AutoSnippet language="dart" {...remoteTodos}></AutoSnippet>

现在我们已经定义了一个 [AsyncNotifierProvider] ，我们可以使用它来与UI中的待办清单交互：

<CodeBlock>{trimSnippet(remoteTodosConsumer)}</CodeBlock>

[notifier]: https://pub.dev/documentation/riverpod/latest/riverpod/Notifier-class.html
[notifierprovider]: https://pub.dev/documentation/riverpod/latest/riverpod/NotifierProvider.html
[asyncnotifier]: https://pub.dev/documentation/riverpod/latest/riverpod/AsyncNotifier-class.html
[asyncnotifierprovider]: https://pub.dev/documentation/riverpod/latest/riverpod/AsyncNotifierProvider.html
